/*
计网实验二:模拟802.11 mac层CSMA/CA协议
在二进制指数回退的基础上,想出策略减少碰撞提高利用率(五个站单信道)
目标:1.获得各个站的等待时间以及队列长度分布
    2.计算碰撞概率
    3.计算吞吐量并评估效率

@author:lzh
 */

/**
 * CSMA/CA:载波监听/冲突避免,需要发送时,以随机退后开始
 * 基本元素:
 * macChannel:访问介质,即传输信道
 * 传输Frame;
 * 需要被Station监听状态(是否正在传输Frame,isTransmitting);
 * 当一个时间槽同时多个Station传输Frame时,发生碰撞;
 * 若在时间槽开始时,有一个Station通需要发送,则能发送成功
 * 在仿真中,控制Frame传输成功时通知Source Station,即ACK;
 * Station:数据包发送站
 * 生成并发送Frame;
 * 监听MacChannel状态(先听在发,不能边听边发);
 * 控制二进制指数回退[0~2^(i-1)个时间槽];
 * 在固定时间内接收到ACK则说明发送成功,否则发生碰撞
 * Frame:数据包,在Channel上传输
 * 在每个站上随机到达(总体满足泊松分布);
 * 长度随机,在仿真中为了简化设为固定;
 * 为了简化只存在数据帧;
 * 在仿真中,为了省略ACK,需要包含Source Station
 * 如何得知发生碰撞:超时,无ACK
 * <p>
 * 假设:
 * 1.每个帧的传输时间固定,即一个帧时(帧的长度除以比特率)
 * 2.帧生成的速度满足泊松分布(平均每个帧时产生N个帧,0<N<1)
 * 3.划分时间槽,DIFS;
 * 为了简化,省略ACK的传输时间
 * <p>
 * 仿真:
 * 1.每次DIFS相当于1个时间槽,可能的传输时间/冲突时间相当于3/4个时间槽;
 * 2.帧到达:
 * 帧到达间隔满足泊松分布
 * 帧可能在任意时刻到达,若到达时Channel为忙,则当其变为空闲时,执行一次随机后退并发送;
 * 若为空闲,也执行一次随机后退,并发送
 * 3.帧发送:
 * 当接收到Channel空闲消息后,开始执行随机后退并发送Frame
 * 在时间槽开始,Station向Channel发送消息,即传输Frame,并等待接收ACK消息;
 * 若接收到ACK消息,则该Frame发送成功,移除该Frame;
 * 否则说明发送失败,执行随机后退后再次尝试发送
 * 若Channel在一个时间槽接收到多个发送消息,则说明发生碰撞,不发送ACK消息;
 * 若只有一个发送消息,则传输成功,向相应的站调用ACK消息;
 * 用不同的消息模拟ACK与无ACK
 * 传输一个消息成功后,向所有Station发送通知:信道空闲
 * 4.随机后退:
 * 由Station记录随机后退次数i;
 * 若Channel为忙状态,则该时间槽不计入随机后退;
 * 当随机后退次数到达上限时,??
 * 5.顺序:
 * 时间槽的开始:回退结束的Station开始发送->其他Station监听
 * <p>
 * 拓展思路:1.ACK,可以将一次循环视为一个SIFS;两次循环视为一个DIFS
 */

/*
速度2Mbps
2000B
 */

/*
衡量效率的标准:
碰撞概率
吞吐量:单位时间发送的数据包的数量
代价:需要进行的操作的复杂度
    发送成功一次的等待时间\检测次数
 */

public class Model {
    public static void main(String[] args) {
        new TimeLine().start();
        System.out.println("collisionNumOfChannel:" + Recorder.collisionNumOfChannel);
        System.out.println("sendNumOfChannel:" + Recorder.sendFrameNumOfChannel);
        System.out.println("collision of channel p:"+Recorder.getCollisionOfChannelP());
        System.out.println("emptySlotP:" + Recorder.getEmptyP(TimeLine.loopNum));
    }
}
